/**
 * Alipay.com Inc. Copyright (c) 2004-2012 All Rights Reserved.
 */
package com.aiwiown.face;

import com.aiwiown.face.internal.util.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author runzhi
 */
public class ApiConstants {

    public static final String SIGN_TYPE = "sign_type";

    public static final String SIGN_TYPE_RSA = "RSA";

    /**
     * sha256WithRsa 算法请求类型
     */
    public static final String SIGN_TYPE_RSA2 = "RSA2";

    public static final String SHA_TYPE = "SHA1";

    public static final String SHA_TYPE256 = "SHA256";

    public static final String SIGN_TYPE_SM2 = "SM2";

    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";

    public static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA";

    public static final String ENCRYPT_TYPE_AES = "AES";

    public static final String APP_ID = "app_id";

    public static final String TARGET_APP_ID = "target_app_id";

    public static final String FORMAT = "format";

    public static final String METHOD = "method";

    public static final String TIMESTAMP = "timestamp";

    public static final String VERSION = "version";

    public static final String SIGN = "sign";

    public static final String ACCESS_TOKEN = "auth_token";

    public static final String APP_AUTH_TOKEN = "app_auth_token";

    public static final String TERMINAL_TYPE = "terminal_type";

    public static final String TERMINAL_INFO = "terminal_info";

    public static final String CHARSET = "charset";

    public static final String NOTIFY_URL = "notify_url";

    public static final String RETURN_URL = "return_url";

    public static final String ENCRYPT_TYPE = "encrypt_type";

    public static final String APP_CERT_SN = "app_cert_sn";

    //-----===-------///

    public static final String BIZ_CONTENT_KEY = "biz_content";

    public static final String BAD_ARGUMENTS_CODE = "400";

    /**
     * 默认时间格式
     **/
    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * Date默认时区
     **/
    public static final String DATE_TIMEZONE = "GMT+8";

    /**
     * UTF-8字符集
     **/
    @Deprecated
    public static final String CHARSET_UTF8 = "UTF-8";

    /**
     * GBK字符集
     **/
    @Deprecated
    public static final String CHARSET_GBK = "GBK";

    public enum Charset {
        /**
         * UTF-8字符集
         */
        UTF8("UTF-8"),
        /**
         * GBK字符集
         */
        GBK("GBK");

        private String code;

        Charset(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }
    }

    /**
     * JSON 应格式
     */
    @Deprecated
    public static final String FORMAT_JSON = "json";

    /**
     * XML 应格式
     */
    @Deprecated
    public static final String FORMAT_XML = "xml";

    public enum Format {
        /**
         * JSON 响应格式
         */
        JSON("json"),
        /**
         * XML 响应格式
         */
        XML("xml");

        private String code;

        Format(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }
    }

    /**
     * SDK版本号
     */
    public static final String SDK_VERSION = "";

    /**
     * 超时时间
     */
    public final static int READ_OUT_TIME = 50000;
    /**
     * 连接超时时间
     */
    public final static int CONNECT_TIME_OUT = 30000;

    /**
     * httpCode对应的错误描述信息
     * httpCode信息直接返回语言描述信息
     */
    private static final Map<String, String> HTTP_ERROR_MESSAGE_MAP = new HashMap<>();

    /**
     * 请求成功,认证不成功返回的错误描述信息,当前对象在应用服务使用即可
     * 业务相关信息在各自业务处理,不会返回,只定义而已
     */
    private static final Map<String, String> RESULT_ERROR_MESSAGE_MAP = new HashMap<>();

    /**
     * 字段正则校验  异常前缀匹配
     */
    private static final Map<String, String> RESULT_PREFIX_ERROR_MESSAGE_MAP = new HashMap<>();

    /**
     * 获取错误信息
     *
     * @param code 异常编码
     * @return 错误描述
     */
    public static String getCodeMessage(String code) {
        String message = HTTP_ERROR_MESSAGE_MAP.get(code);
        if (StringUtils.isEmpty(message)) {
            message = RESULT_ERROR_MESSAGE_MAP.get(code);
        }
        if (StringUtils.isEmpty(message)) {
            Set<String> prefixs = RESULT_PREFIX_ERROR_MESSAGE_MAP.keySet();
            for (String prefix : prefixs) {
                Pattern pattern = Pattern.compile(prefix);
                Matcher matcher = pattern.matcher(code);
                if (!matcher.find()) {
                    //未查询到继续
                    continue;
                }
                message = RESULT_PREFIX_ERROR_MESSAGE_MAP.get(prefix);
                message = String.format(message, matcher.replaceAll(""));
                if (!StringUtils.isEmpty(message)) {
                    break;
                }
            }
        }
        return message;
    }

    static {
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT", "自拍图像无法正确解析，有可能不是一个图像文件、或有数据破损。");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: data_source", "参考数据的图片无法解析、或者参考数据没有照片。");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: facetoken", "请使用接口 detect 后获得的facetoken");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: image", "image中没有人脸或图片解析失败");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: image_ref1", "参数 image_ref1 对应的图像无法解析，有可能不是图像文件、或有数据破损。");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: image_ref2", "参数 image_ref2 对应的图像无法解析，有可能不是图像文件、或有数据破损。");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT: image_ref3", "参数 image_ref3 对应的图像无法解析，有可能不是图像文件、或有数据破损。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND", "表示上传的 image_ref[x] 的图像中，没有检测到人脸。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND: data_source", "没有检测到人脸。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND: image_ref1", "上传的 image_ref1 的图像中，没有检测到人脸。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND: image_ref2", "上传的 image_ref2 的图像中，没有检测到人脸。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND: image_ref3", "上传的 image_ref3 的图像中，没有检测到人脸。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_SIZE: image", "图片的像素不符合要求，图片像素多大或者过小");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_SIZE: image_ref1", "客户上传的图像 image_ref1 太大，具体是指像素尺寸的长或宽超过4096像素。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_SIZE: image_ref2", "客户上传的图像 image_ref2 太大，具体是指像素尺寸的长或宽超过4096像素。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_SIZE: image_ref3", "客户上传的图像 image_ref3 太大，具体是指像素尺寸的长或宽超过4096像素。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR", "客户身份信息验证不通过");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: API_KEY_BE_DISCONTINUED", "api_key被停用");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: IP_NOT_ALLOWED", "不允许访问的IP");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: LIMIT_REACHED", "这个api_key对当前API的调用量达到上限。仅当api_key为测试key。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: MORE_RETRY_TIMES", "比对重试次数达到上限");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: NO_VERIFY_PERMISSION", "没有人脸比对的权限，但是本次请求依然尝试调用了。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: NO_DATA_SOURCE_PERMISSION", "没有KYC验证的权限，但是本次请求依然尝试调用了。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: No data source permission.", "仅为FaceID Verify API存在，表示使用“KYC验证”的方式调用FaceID Verify API，但是没有“KYC验证”的权限。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: DENIED", "无权限调用当前API");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: DENIED.", "无权限调用当前API");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: Denied.", "api_key无权限或被停用");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: Denied by Client", "用户自己禁止该api_key调用");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: Denied by Admin", "管理员禁止该api_key调用");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: Insufficient Account Balance", "由于账户余额不足禁止调用");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: Limit reached.", "这个api_key对当前API的调用量达到上限。仅当api_key为测试key时返回。");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: EXPIRED_SIGN", "签名已过期");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR: INVALID_SIGN", "无效签名");
        HTTP_ERROR_MESSAGE_MAP.put("LOW_QUALITY", "image图质量太差");
        HTTP_ERROR_MESSAGE_MAP.put("MULTIPLE_FACES", "image图片中的有多张人脸");
        HTTP_ERROR_MESSAGE_MAP.put("MULTIPLE_FACES: image", "参数 image 对应的图像检测到了多张人脸");
        HTTP_ERROR_MESSAGE_MAP.put("MULTIPLE_FACES: image_ref1", "参数 image_ref1 对应的图像检测到了多张人脸");
        HTTP_ERROR_MESSAGE_MAP.put("MULTIPLE_FACES: image_ref2", "参数 image_ref2 对应的图像检测到了多张人脸");
        HTTP_ERROR_MESSAGE_MAP.put("MULTIPLE_FACES: image_ref3", "参数 image_ref3 对应的图像检测到了多张人脸");
        HTTP_ERROR_MESSAGE_MAP.put("AUTHENTICATION_ERROR", "api_key和api_secret不匹配。");
        HTTP_ERROR_MESSAGE_MAP.put("CONCURRENCY_LIMIT_EXCEEDED", "并发数超过限制");
        HTTP_ERROR_MESSAGE_MAP.put("API_NOT_FOUND", "所调用的API不存在。");
        HTTP_ERROR_MESSAGE_MAP.put("INTERNAL_ERROR", "服务器内部错误，当此类错误发生时请再次请求，如果持续出现此类错误，请及时联系 FaceID/Face++ 客服或商务。");
        HTTP_ERROR_MESSAGE_MAP.put("MEGLIVE_DATA_ERROR", "上传的meglive_data数据包解析失败。请将SDK产生的meglive_data数据包直接传递到此API，任何对数据包的修改都会导致数据包解析失败的问题。");
        HTTP_ERROR_MESSAGE_MAP.put("MEGLIVE_DATA_BIZ_TOKEN_NOT_MATCH", "上传的meglive_data包中的biz_token和传入参数biz_token不一致。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_NAME_FORMAT", "KYC验证时，idcard_name参数字符数过多（多于32字符）、或者使用错误的编码（姓名要求以UTF-8编码）。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_IDCARD_NUMBER", "人脸比对时，idcard_number参数不是正确的证件号码格式。证件号码必定为18位数字，且最后一位可以是X（大小写均可）。");
        HTTP_ERROR_MESSAGE_MAP.put("RESULT_NOT_FOUND", "此错误类型表示传入的业务编号错误。");
        HTTP_ERROR_MESSAGE_MAP.put("DATA_DESTROYED", "超过可查询时间或超过最多可查询次数");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_TOKEN", "参数所对应调用Raw-GetRandomNumber API的token_random_number不存在、或格式错误、或已过期、或并非通过一个API Key调用的Raw-GetRandomNumber API返回的token_random_number。");
        HTTP_ERROR_MESSAGE_MAP.put("VIDEO_FACE_NOT_FOUND", "上传的视频中没有检测到人脸");
        HTTP_ERROR_MESSAGE_MAP.put("VIDEO_LOW_FACE_QUALITY", "上传的视频中人脸质量太差");
        HTTP_ERROR_MESSAGE_MAP.put("VIDEO_INVALID_DURATION", "上传的视频时长不对");
        HTTP_ERROR_MESSAGE_MAP.put("VIDEO_NO_AUDIO", "上传视频中没有音轨，通常是由于手机的录音权限没有打开或者受到阻止。");
        HTTP_ERROR_MESSAGE_MAP.put("VIDEO_UNSUPPORTED_FORMAT", "视频无法解析，有可能是ffmpeg不支持的格式或视频有破损。");
        HTTP_ERROR_MESSAGE_MAP.put("FACE_BLURRED", "人脸太模糊，不适宜比对。");
        HTTP_ERROR_MESSAGE_MAP.put("FACE_POOR_LIGHT", "人脸区过亮或过暗，不适宜比对。");
        HTTP_ERROR_MESSAGE_MAP.put("FACE_NOT_FRONT", "自拍图像中的人脸非正面朝向。正面朝向是指：面部无明显的左右上下倾斜，上下不颠倒。");
        HTTP_ERROR_MESSAGE_MAP.put("FACE_NOT_PROPER_POSITION", "人脸位置不合适。理想情况是人脸在画面中央，人脸包围盒的长宽分别是画面长宽的三分之一。如果实际情况偏离理想情况太多，就会触发错误，比如人脸太小或太大或位置太偏，以致于不适宜后续的活体判定和人脸比对。");
        HTTP_ERROR_MESSAGE_MAP.put("FACE_NOT_SIDE", "自拍图像中的人脸非合适的侧脸照。合适的侧脸照，是指面部左右转动在15度－45度之间，面部无明显的上仰下俯，否则就会被判定为此错误。");
        HTTP_ERROR_MESSAGE_MAP.put("NO_SUCH_ID_NUMBER", "KYC验证时，参考数据中没有此身份证号码的记录。");
        HTTP_ERROR_MESSAGE_MAP.put("ID_NUMBER_NAME_NOT_MATCH", "证件号码和姓名不匹配");
        HTTP_ERROR_MESSAGE_MAP.put("DATA_SOURCE_ERROR", "KYC验证时，verify方法调用参考数据发生错误，一般来说是参考数据出错。出现此错误时建议停止业务，并立即联系FaceID客服或商务，待确定参考数据正常后再开启业务。");
        HTTP_ERROR_MESSAGE_MAP.put("ID_CARD_NOT_FOUND", "图片中没有找到身份证。");
        HTTP_ERROR_MESSAGE_MAP.put("MAGE_ERROR_UNSUPPORTED_FORMAT: image", "图片解析失败");
        HTTP_ERROR_MESSAGE_MAP.put("IDCARD_NO_PHOTO", "数据返回的图片无法解析、或者没有照片。");
        HTTP_ERROR_MESSAGE_MAP.put("DATA_VALIDATION_ERROR", "配合MegLive SDK使用时，delta 参数的校验数据与上传的图像无法一一对应，或者图像上传不完整。");
        HTTP_ERROR_MESSAGE_MAP.put("DELTA_USED", "配合MegLive SDK使用时，系统检验出delta已被使用过。此错误仅当客户设置了可选参数check_delta且delta确实被使用过时才触发错误返回，其他情况下不触发此错误信息。");
        HTTP_ERROR_MESSAGE_MAP.put("MEGLIVE_BIZ_NO_USED", "配合MegLiveFlash SDK使用时，需要通过一个 meglive_biz_no 进行算法初始化。如果使用重复的 meglive_biz_no ，并将生成的结果上传至 verify 接口调用，则会返回此错误。");
        HTTP_ERROR_MESSAGE_MAP.put("Request Entity Too Large", "客户发送的请求大小超过了20MB限制。该错误的返回格式为纯文本，不是json格式。");
        HTTP_ERROR_MESSAGE_MAP.put("COEXISTENCE_ARGUMENTS", "同时传入了要求是二选一或多选一的参数。如有特殊说明则不返回此错误。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_FACE_TOKEN", "face_token无效");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_DOWNLOAD_TIMEOUT", "下载图片超时");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_OUTER_ID", "outer_id无效");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_FACESET_TOKEN", "faceset_token无效");
        HTTP_ERROR_MESSAGE_MAP.put("EMPTY_FACESET", "FaceSet 中没有 face_token");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_FACE_TOKENS_SIZE", "face_tokens数组长度不符合要求");
        HTTP_ERROR_MESSAGE_MAP.put("FACESET_EXIST", "想要创建的 FaceSet 已经存在（当提供了一个当前存储空间内下已存在的 outer_id，且 force_merge 为0时）");
        HTTP_ERROR_MESSAGE_MAP.put("FACESET_QUOTA_EXCEEDED", "FaceSet 数量达到上限，不能继续创建 FaceSet。");
        HTTP_ERROR_MESSAGE_MAP.put("FACESET_NOT_EMPTY", "FaceSet不为空，不能删除（设置check_empty=1时）。");
        HTTP_ERROR_MESSAGE_MAP.put("NEW_OUTER_ID_EXIST", "提供的new_outer_id与已有outer_id重复");
        HTTP_ERROR_MESSAGE_MAP.put("IMAGE_FILE_TOO_LARGE", "客户上传的图像文件太大。本 API 要求图片文件大小不超过 2 MB。");
        HTTP_ERROR_MESSAGE_MAP.put("MISMATCH_TEMPLATE", "不匹配指定模版，可能的原因包括：非模版的图片,未检测到文字或者文字较少,图片质量较差,图片模糊,光线较暗等。");
        HTTP_ERROR_MESSAGE_MAP.put("INVALID_TEMPID", "TemplateID无效或未找到对应的生效模板");
        HTTP_ERROR_MESSAGE_MAP.put("UNKNOWN_VERIFY_TYPE", "不识别的认证类型");

        RESULT_ERROR_MESSAGE_MAP.put("SUCCESS", "待比对照片与其他照对比均是同一个人");
        RESULT_ERROR_MESSAGE_MAP.put("PASSED", "流程验证通过");
        RESULT_ERROR_MESSAGE_MAP.put("OK", "完成了 FaceID Lite 验证（OK并不表示通过了验证，是流程正常结束）");
        RESULT_ERROR_MESSAGE_MAP.put("PASS_LIVING_NOT_THE_SAME", "通过了活体检测，但是经过验证，待比对照片与其他照片中的至少一张，不是同一个人。");
        RESULT_ERROR_MESSAGE_MAP.put("NO_ID_CARD_NUMBER", "参考数据错误，可能原因：无此身份证号、照片格式错误、照片中找不到人脸等可能。");
        RESULT_ERROR_MESSAGE_MAP.put("ID_NUMBER_NAME_NOT_MATCH", "证件号码和姓名不匹配");
        RESULT_ERROR_MESSAGE_MAP.put("NO_FACE_FOUND", "参考数据错误，可能原因：无此身份证号、照片格式错误、照片中找不到人脸等可能。");
        RESULT_ERROR_MESSAGE_MAP.put("NO_ID_PHOTO", "参考数据错误，可能原因：无此身份证号、照片格式错误、照片中找不到人脸等可能。");
        RESULT_ERROR_MESSAGE_MAP.put("PHOTO_FORMAT_ERROR", "参考数据错误，可能原因：无此身份证号、照片格式错误、照片中找不到人脸等可能。");
        RESULT_ERROR_MESSAGE_MAP.put("DATA_SOURCE_ERROR", "参考数据出现错误");
        RESULT_ERROR_MESSAGE_MAP.put("FAIL_LIVING_FACE_ATTACK", "未经过活体判断，可能的原因：是假脸攻击。");
        RESULT_ERROR_MESSAGE_MAP.put("VIDEO_LACK_FRAMES", "获取到的活体数据故障，请换一台手机重试。");
        RESULT_ERROR_MESSAGE_MAP.put("FAIL_EYES_CLOSE_DETECTION", "未通过闭眼检测，活体失败。");
        RESULT_ERROR_MESSAGE_MAP.put("BIZ_TOKEN_DENIED", "传入的 biz_token 不符合要求");
        RESULT_ERROR_MESSAGE_MAP.put("AUTHENTICATION_FAIL", "鉴权失败");
        RESULT_ERROR_MESSAGE_MAP.put("MOBILE_PHONE_NOT_SUPPORT", "手机在不支持列表里");
        RESULT_ERROR_MESSAGE_MAP.put("SDK_TOO_OLD", "SDK版本过旧，已经不被支持");
        RESULT_ERROR_MESSAGE_MAP.put("MOBILE_PHONE_NO_AUTHORITY", "没有权限（运动传感器、存储、相机）");
        RESULT_ERROR_MESSAGE_MAP.put("USER_CANCELLATION", "用户活体失败，原因可能如下：用户取消了、验证过程超时等原因。");
        RESULT_ERROR_MESSAGE_MAP.put("USER_TIMEOUT", "用户活体失败，原因可能如下：用户取消了、验证过程超时等原因。");
        RESULT_ERROR_MESSAGE_MAP.put("VERIFICATION_FAILURE", "用户活体失败，原因可能如下：用户取消了、验证过程超时等原因。");
        RESULT_ERROR_MESSAGE_MAP.put("UNDETECTED_FACE", "用户活体失败，原因可能如下：用户取消了、验证过程超时等原因。");
        RESULT_ERROR_MESSAGE_MAP.put("ACTION_ERROR", "用户活体失败，原因可能如下：用户取消了、验证过程超时等原因。");
        RESULT_ERROR_MESSAGE_MAP.put("GET_CONFIG_FAIL", "用户活体失败，原因：读取配置失败。");
        RESULT_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_URL", "无法从指定的image_url下载图片，图片URL错误或者无效。");
        RESULT_ERROR_MESSAGE_MAP.put("action_mixed", "做了错误的动作");
        RESULT_ERROR_MESSAGE_MAP.put("not_video", "检测到活体攻击（也有可能是网络不通畅或动作过快造成的）");
        RESULT_ERROR_MESSAGE_MAP.put("timeout", "活体动作超时");
        RESULT_ERROR_MESSAGE_MAP.put("quality_check_timeout", "照镜子流程超时（120秒）");
        RESULT_ERROR_MESSAGE_MAP.put("no_input_frame", "视频流输入中断（可能是网络中断造成的）");
        RESULT_ERROR_MESSAGE_MAP.put("interrupt_in_mirro_state", "用户在照镜子流程中断了网页端活体检测");
        RESULT_ERROR_MESSAGE_MAP.put("interrupt_in_action_state", "用户在活体做动作时中断了网页端活体检测");
        RESULT_ERROR_MESSAGE_MAP.put("VERIFY_API_FAILED", "表示调用Verify请求时发生错误，哪些错误是否计费请参照Verify错误返回表。");
        RESULT_ERROR_MESSAGE_MAP.put("INTERNAL_ERROR", "表示服务器发生了内部错误");
        RESULT_ERROR_MESSAGE_MAP.put("VIDEO_SR_ERROR", "语音识别结果与要求不符。（仅当视频验证流程时）");
        RESULT_ERROR_MESSAGE_MAP.put("VIDEO_NOT_SYNCHRONIZED", "视频中唇语识别错误。（仅当视频验证流程时）");
        RESULT_ERROR_MESSAGE_MAP.put("VIDEO_FACE_INCONSISTENT", " 视频过程中的人脸不一致");
        RESULT_ERROR_MESSAGE_MAP.put("SELFIE_INCONSISTENT", "正脸侧脸照不一致 。（仅双角度活体验证时）");
        RESULT_ERROR_MESSAGE_MAP.put("SELFIE_METADATA_INCONSISTENT", "正侧脸照的照片不都为JPG编码、或者元信息不一致。（仅双角度活体验证时，且liveness_preferences不为“selfie_no_metadata_check”；对此项的判定优先于对“SELFIE_INCONSISTENT”的判定。）");
        RESULT_ERROR_MESSAGE_MAP.put("MASK", "面具攻击");
        RESULT_ERROR_MESSAGE_MAP.put("SCREEN_REPLAY", "屏幕翻拍");
        RESULT_ERROR_MESSAGE_MAP.put("FACEGEN", "软件合成脸");
        RESULT_ERROR_MESSAGE_MAP.put("NOT_STARTED", "get_token 之后，并没有调用过 do 方法，还没有开始验证。");
        RESULT_ERROR_MESSAGE_MAP.put("PROCESSING", "正在进行 FaceID Lite 验证。");
        RESULT_ERROR_MESSAGE_MAP.put("FAILED", "验证流程未完成或出现异常");
        RESULT_ERROR_MESSAGE_MAP.put("CANCELLED", "用户主动取消了验证流程");
        RESULT_ERROR_MESSAGE_MAP.put("TIMEOUT", "流程超时");
        RESULT_ERROR_MESSAGE_MAP.put("FAIL", "活体检测失败");
        RESULT_ERROR_MESSAGE_MAP.put("NO_SUCH_ID_NUMBER", "没有此身份证号码的记录");
        RESULT_ERROR_MESSAGE_MAP.put("1001", "图片上传成功，说明上传的图片中检测到了银行卡，图中若包含多张银行卡将随机返回其中一张的信息。");
        RESULT_ERROR_MESSAGE_MAP.put("1002", "图片上传成功，银行卡号存在未识别出来的数字。");
        RESULT_ERROR_MESSAGE_MAP.put("2001", "图片格式不支持");
        RESULT_ERROR_MESSAGE_MAP.put("2002", "图片中未检测到银行卡");
        RESULT_ERROR_MESSAGE_MAP.put("2003", "图片大小不符合要求");

        /**===================================正则匹配数据==========================================*/
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("BAD_ARGUMENTS", "参数解析错误 %s");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("MISSING_ARGUMENTS", "缺少参数 %s");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("RESULT_ERROR_MESSAGE_MAP", "客户通过参数 %s 上传的图片文件太大。本 API 要求图片文件大小不超过 2 MB。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("IMAGE_DOWNLOAD_TIMEOUT", "下载图片超时 %s");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("INSUFFICIENT_PERMISSION", "试用 API Key 无法使用 %s 对应的参数。请勿传入此参数。或者使用正式 API Key 调用。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("IMAGE_FILE_TOO_LARGE", "客户通过参数 %s 上传的图片文件太大。本 API 要求图片文件大小不超过 2 MB。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("INVALID_FACE_TOKEN", "使用face_token作为参数时，所传的face_token不存在。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_URL", "无法从指定的 %s 下载图片，图片URL错误或者无效。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("INVALID_IMAGE_SIZE", "参数 %s 对应的客户上传的图像像素尺寸太大或太小，图片要求请参照本API描述。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("IMAGE_ERROR_UNSUPPORTED_FORMAT", "参数 %s 对应的图像无法正确解析，有可能不是一个图像文件、或有数据破损。");
        RESULT_PREFIX_ERROR_MESSAGE_MAP.put("AUTHORIZATION_ERROR", "参数 %s 权限错误");
    }

}
